package ModeleBelote;


//
// IUT de Nice / Departement informatique / Module APO-Java
// Annee 2011_2012 - Composants generiques
//
// Classe ModelePanneauG - Gestion des donnees applicatives d'un panneau 
//                         (Modele MVC)
//
// Edition A     : gestion des zones sensibles d'un panneau
//
//    + Version 1.0.0   : conformite aux besoins TravelMap
//    + Version 1.1.0   : chargement dynamique de la description des zones 
//                        sensibles (nouvelle methode chargerZR)
//    + Version 1.2.0   : extension du modele a plusieurs sources de donnees
//                        (modification du constructeur normal)
//
// Edition B     : gestion de sous panneaux (donnees)
//
//    + Version 2.0.0   : chargement dynamique d'une arborescence de sous 
//                        panneaux
//    + Version 2.1.0   : reunion de la description des zones sensibles et des 
//                        arborescences de sous panneaux dans un dictionnaire
//                        unique des sources de donnnes
//                        + ajout de la methode privee chargerDonnees
//                        + modification signature methode obtenirSP
//                        + ajout de la methode publique obtenirZS
//                        + suppression des methodes chargerZS et chargerSP
//    + Version 2.2.0   : ajout d'une surcharge du constructeur par defaut 
//                        pour les applications qui recueillent toutes 
//                        leurs donnees dynamiquement, par exploration de 
//                        repertoires (Diaporama par exemple)
//
// Auteur : A. Thuaire
//

import java.awt.Dimension;
import java.awt.Rectangle;
import java.util.HashMap;
import java.util.Iterator;

import Config.Data;
  
public class ModelePanneauG {
private HashMap sources;
private HashMap zonesSensibles= new HashMap();
private HashMap sousPanneaux  = new HashMap();

// ---                                              Constructeur par defaut

   public ModelePanneauG() {sources= null;}

// ---                                              Constructeur normal

   public ModelePanneauG (String nomFichier, String version) {
   	
   	  // Controle du cas particulier de l'absence de sources
   	  //
      if (nomFichier == null) return;
      if (version == null) return;
      
      // Charger le fichier de description des sources
      //
      Object description= Data.load(nomFichier, version);
      if (description == null) return;
      
      // Controler la conformite du premier niveau de description
      //
      String origine= description.getClass().getName();
      if (!origine.equals("java.util.HashMap")) return;
      
      // Conserver la description des sources en attribut
      //
      sources= (HashMap)description;
      
      // Parcourir le dictionnaire des sources
      //
      Iterator i=sources.keySet().iterator();
      String cle=null;
      String associe= null;
      boolean status;
   	     	
      while(i.hasNext()) {

         // Acquerir la cle courante
         //
         cle=(String)i.next();
         
         // Acquerir l'associe courant
         //
         associe= (String)sources.get(cle);
         
         // Charger les donnees de la source courante
         //
         status= chargerDonnees(cle, associe);
         if (!status) return;   
      } 
   }
   
// ---                                                  Methode obtenirNomZS

   public String obtenirNomZS (Dimension cible) {
   	
      // Controler la validite du parametre
      //
      if (cible == null) return null;
      
      // Controler la validite de la description courante
      //
      if (zonesSensibles == null) return null;
      
      // Obtenir et controler l'abscisse du point cible
      //
      int x= (int)cible.getWidth();
      if (x < 0) return null;
      
      // Obtenir l'ordonnee du point cible
      //
      int y= (int)cible.getHeight();
      if (y < 0) return null;
            
      // Parcourir le dictionnaire de description des ZS
      //
      Iterator i=zonesSensibles.keySet().iterator();
      String cle=null;
      Rectangle associe= null;
   	     	
      while(i.hasNext()) {

         // Acquerir la cle courante
         //
         cle=(String)i.next();
         
         // Acquerir l'associe courant
         //
         associe= (Rectangle)zonesSensibles.get(cle);
         
         // Controler l'appartenance eventuelle de la position cible
         // au rectangle courant
         //
         if (associe.contains (x, y)) return cle;
      }
      
      // Traiter le cas ou aucune zone sensible ne contient la position cible
      //
   	  return ""; 
   } 
   
// ---                                                      Methode obtenirZS
  
   public HashMap obtenirZS (String nomZS) {
   	
      // Controler la validite du parametre
      //
      if (nomZS == null) return null;
      
      // Restituer l'arborescence cible
      //
      return (HashMap) zonesSensibles.get(nomZS); 
   } 
   
// ---                                                       Methode obtenirSP
  
   public HashMap obtenirSP (String nomRacine) {
   	
      // Controler la validite du parametre
      //
      if (nomRacine == null) return null;
      
      // Restituer l'arborescence cible
      //
      return (HashMap) sousPanneaux.get(nomRacine); 
   } 
   
// ---                                                 Methode chargerDonnees
  
   private boolean chargerDonnees (String nomFichier, String version) { 
   
      // Controler la validite des parametres
      //
      if (nomFichier == null) return false;
      if (version == null) return false;
      
      // Charger le fichier de description 
      //
      Object description= Data.load(nomFichier, version);
      if (description == null) return false;
      
      // Obtenir le type des donnees chargees
      //
      String origine= description.getClass().getName();
      
      // Traiter le cas d'une zone sensible
      //
      if (origine.equals("java.util.LinkedHashMap")) {
      	
         zonesSensibles.put(nomFichier, description);
         return true;	
      } 
      
      // Traiter le cas d'une arborescence de sous panneaux
      //
      if (origine.equals("java.util.HashMap")) {
      	
         sousPanneaux.put(nomFichier, description);
         return true;	
      } 
      
      return false; 
   } 
}    


